package com.ponhu.ea2.stockcenter.service.bms;

import com.ponhu.ea2.common.basic.model.PagedResult;
import com.ponhu.ea2.stockcenter.dto.StockQueryListDTO;
import com.ponhu.ea2.stockcenter.enums.DefinedSystem;
import com.ponhu.ea2.stockcenter.query.ApplyFreeQuery;
import com.ponhu.ea2.stockcenter.vo.*;

import java.util.Collection;
import java.util.List;

/**
 * 库存中心Common接口
 */
public interface StockCommonService {

    /**
     * 获取操作库存中心库存接口请求token
     *
     * @param definedSystem 接入的来源系统
     * @return
     */
    ReturnResponseBean<String> getStockRequestToken(DefinedSystem definedSystem);

    /**
     * 根据订单号获取订单下货品占用库存数
     *
     * @param orderNo 订单号
     * @return
     */
    ReturnResponseBean<List<OrderOccupyStockInfoVO>> getOrderOccupyStockInfo(String orderNo);

    /**
     * 初始化库存中心数据
     */
    void initStockData();

    /**
     * 条件查询全部货品库存列表
     *
     * @return
     */
    PagedResult<StockQueryListVO> getAllInventoryStocks(StockQueryListDTO stockQueryListDTO);

    /**
     * 查询指定货品编码的销售库存占用
     *
     * @return
     */
    PagedResult<StockSaleOccupyVO> getSaleOccupyVosByCode(String inventoryCode, Integer pageIndex, Integer pageSize);

    /**
     * 查询指定货品编码的实物库存占用
     *
     * @return
     */
    PagedResult<StockWhOccupyVO> getWhOccupyVosByCode(String inventoryCode, Integer pageIndex, Integer pageSize);

    /**
     * 获取全部仓库信息列表
     *
     * @return
     */
    List<WarehouseInfoVo> getAllWarehouseInfos();

    /**
     * 查询指定货品的仓库位置和库存数量
     * @param inventoryCodeList
     * @return
     */
    ReturnResponseBean<List<InventoryStockWhVO>> getReallyStockInfo(Collection<String> inventoryCodeList);

    /**
     * 根据货品编码分页查询调拨在途明细数据
     * @param applyFreeQuery
     * @return
     */
    ReturnResponseBean<PagedResult<ApplyFreeStockVO>> getApplyFreeStockDetail(ApplyFreeQuery applyFreeQuery);

    /**
     * 获取可售库存数据
     * @param inventoryCodeList
     * @return
     */
    ReturnResponseBean<List<InventorySalesStockInfo>> getSalesStockInfo(List<String> inventoryCodeList);

    /**
     * 查询可卖库存信息：可售库存+虚拟可售库存-销售占用库存
     *
     * @param inventoryCodes
     * @return
     */
    List<StockMqVO> getSaleStockMqVoList(Collection<String> inventoryCodes);

    String getValueFromRedisBucket(String redisKey, Boolean getAndDel);

    Boolean testRedisKeyEvent(String redisKey, String redisValue, Long timeToLive);

}
